package com.vdong.redis.data.core.json.ops;

import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisOperations;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * ops覆盖接口，用于动态代理
* @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
* @version 
* @since JDK 1.6
* create on 2017年3月31日
* Copyright 2017 ZZJR All Rights Reserved.
*
*/
public interface FastJsonListOperations<K,V> extends ListOperations<K,V> {
	/**
	 * 获取从start到end下表的所有元素
	 */
	
	List<V> range(K key, long start, long end);
	/**
	 * 修剪列表，保留从start到end下表的元素
	 */
	
	void trim(K key, long start, long end);
	/**
	 * 个数
	 */
	
	Long size(K key);
	/**
	 * 从左边加入队列
	 */
	
	Long leftPush(K key, V value);
	/**
	 * 多个元素从左边加入队列
	 */
	
	Long leftPushAll(K key, V... values);
	/**
	 * 多个元素从左边加入队列
	 */
	
	Long leftPushAll(K key, Collection<V> values);
	/**
	 * 从左边加入队列，如果该队列存在的话
	 */
	
	Long leftPushIfPresent(K key, V value);
	/**
	 * 在存在的元素之前插入元素
	 */
	
	Long leftPush(K key, V pivot, V value);
	/**
	 * 从右加入队列
	 */
	
	Long rightPush(K key, V value);
	/**
	 * 多个元素从右加入队列
	 */
	
	Long rightPushAll(K key, V... values);
	/**
	 * 多个元素从右加入队列
	 */
	
	Long rightPushAll(K key, Collection<V> values);
	/**
	 * 从右加入队列，如果该队列存在的话
	 */
	
	Long rightPushIfPresent(K key, V value);
	/**
	 * 在某个元素之后加入元素
	 */
	
	Long rightPush(K key, V pivot, V value);
	/**
	 * 在指定位置加入元素
	 */
	
	void set(K key, long index, V value);
	/**
	 * 删除n个和给定值相同的元素
	 */
	
	Long remove(K key, long count, Object value);
	/**
	 * 获得指定位置的元素
	 */
	
	V index(K key, long index);
	/**
	 * 左边第一个元素出队
	 */
	
	V leftPop(K key);
	/**
	 * 左边第一个元素出队，阻塞模式
	 */
	
	V leftPop(K key, long timeout, TimeUnit unit);
	/**
	 * 右边第一个元素出队
	 */
	
	V rightPop(K key);
	/**
	 * 右边第一个元素出队，阻塞模式
	 */
	
	V rightPop(K key, long timeout, TimeUnit unit);
	/**
	 * 从第一个队列中右边移除第一个元素，插入第二个队列的左边
	 */
	
	V rightPopAndLeftPush(K sourceKey, K destinationKey);
	/**
	 * 从第一个队列中右边移除第一个元素，插入第二个队列的左边，阻塞模式
	 */
	
	V rightPopAndLeftPush(K sourceKey, K destinationKey, long timeout, TimeUnit unit);

	
	RedisOperations<K,V> getOperations();
	
}